package com.example.interruptLearning;

public class Interrupt1 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println("first:" + Thread.currentThread().isInterrupted());
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("Thread is running");
            }
            System.out.println("second:" + Thread.currentThread().isInterrupted());
            try {
                Thread.sleep(500);
                /**
                 * 立刻抛出 InterruptedException
                 */
                for (int i = 0; i < 10; i++) {
                    System.out.println(i);
                }
                System.out.println("third:" + Thread.currentThread().isInterrupted());
            } catch (InterruptedException e) {
                System.out.println("Thread is interrupted while waiting");
                /**
                 * 当线程调用诸如：
                 * Thread.sleep(...)
                 * Object.wait(...)
                 * Thread.join(...)
                 * BlockingQueue.take()
                 * 这类 可能导致线程阻塞/挂起的方法时，如果此时中断标志已经是 true，JVM 会：
                 * 1.不执行挂起操作
                 * 2.立刻抛出 InterruptedException
                 * 3.并把中断标志位设为 false（重置）
                 *
                 * 如果线程已经被中断，而你又调用了 sleep()，JVM 会立刻抛出 InterruptedException，并清除中断标志。
                 * 你要是还想“保留”中断标志，就必须自己手动调用 interrupt() 恢复它。
                 */
                System.out.println("fourth:" + Thread.currentThread().isInterrupted());
                Thread.currentThread().interrupt();
                System.out.println("fifth:" + Thread.currentThread().isInterrupted());
            }
            System.out.println("Thread check the aim of interruption");
        });

        thread.start();

        Thread.sleep(1000);

        /**
         * Thread.interrupt() 只是设置线程的中断标志位为 true；
         * 如果线程正在执行阻塞操作（如 sleep()、wait()、join()），会抛出 InterruptedException；
         * 如果线程只是普通运行逻辑，那就需要你主动调用 isInterrupted() 去检测中断标志；
         * 线程自己决定是否终止（协作式退出）。
         */
        thread.interrupt();
    }
}
